#ifndef EVENTO_TRATADORES_PRONTOS_H
#define EVENTO_TRATADORES_PRONTOS_H

#include "evento/evento.h"
#include "evento/tratador.h"

#include <boost/function.hpp>

using namespace boost;

namespace evento {
/**
  * \brief Emoldura uma funcao com um tratador.
  * Quando o tratador nao eh nada mais que uma simples funcao, isso pode
  * ajudar
  */
class func_tratador : public tratador {
  public:
  typedef function<void (const evento& event, int passou)> func;
  func_tratador(func f):tratador(true), func_(f) {}
  virtual void invoca(const evento& event, int passou) {
    func_(event, passou);
  }

  private:
  func func_;
};

/**
  * \brief Emoldura uma funcao sem parametros com um tratador.
  */
class func_tratador_simples : public tratador {
  public:
  typedef function<void ()> func;
  func_tratador_simples(func f):tratador(true), func_(f) {}
  virtual void invoca(const evento& event, int passou) {
    func_();
  }

  private:
  func func_;
};

/**
  * \brief No momento em que o evento ocorre, muda o valor da variavel var \
  * para val.
  */
template <typename _T>
class muda_valor : public tratador {
  public:
  muda_valor(_T& var, _T val):tratador(true), var_(var), val_(val) {}
  void invoca(const evento& event, int passou) {
    var_ = val_;
  }
  
  private:
  _T& var_;
  _T val_;
};

}
#endif
